home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / PASCAL / 0187.ZIP / LIFETRBO.PAS < prev    next >
Pascal/Delphi Source File  |  1984-06-12  |  4KB  |  135 lines

  1. PROGRAM LIFE;
  2. { Simulation of Conway's game of Life on a bounded grid. }
  3. { From Data Structures and Program Design by Robert Kruse  Prentice Hall }
  4. { Typed in by: Malcolm McCorquodale. }
  5. { Modified by: Jeff Firestone. }
  6. { Version 1. Page 6. }
  7. CONST
  8.      MAXROW = 23;      { max # of rows allowed }
  9.      MAXCOL = 80;      { max # of cols allowed }
  10. TYPE
  11.      ROW = 1..MAXROW;
  12.      COL = 1..MAXCOL;
  13.      STATUS = (DEAD,ALIVE);
  14.      GRID = ARRAY[ROW,COL] OF STATUS;
  15. VAR
  16.      MAP, NEWMAP : GRID;
  17.      I : ROW;
  18.      J : COL;
  19.      GENERATION, LASTGENERATION : INTEGER;
  20.  
  21.  
  22. {--------------------------------------------}
  23.  
  24. PROCEDURE GENERATECOORDINATES;
  25. VAR
  26.      CNT, NUMBERCOORDINATES : INTEGER;
  27. BEGIN
  28.      WRITE ('How many coordinates would you like generated : ');
  29.      READLN (NUMBERCOORDINATES);
  30.      FOR CNT:= 1 TO NUMBERCOORDINATES DO
  31.        MAP[(RANDOM(MAXROW-1)+1), (RANDOM(MAXCOL-1)+1)]:= ALIVE;
  32. END;
  33.  
  34. {--------------------------------------------}
  35.  
  36. PROCEDURE INITIALIZE;
  37. VAR
  38.      X,Y : INTEGER;    { COORDINATES OF CELL }
  39.      ANSWER : STRING [10];
  40. BEGIN
  41.      WRITELN ('This program is a simulation of the game of life.');
  42.      WRITE ('Enter the number of generations to run : ');
  43.      READLN (LASTGENERATION);
  44.      IF LASTGENERATION <= 0 THEN WRITELN ('No output for 0 generations.');
  45.      FOR X := 1 TO MAXROW DO
  46.         FOR Y := 1 TO MAXCOL DO
  47.            MAP[X,Y] := DEAD;
  48.      WRITE ('Do you wish to have the coordinate pairs generated ');
  49.      WRITE ('Automatically : ');
  50.      READLN (ANSWER);
  51.      IF UPCASE(ANSWER[1]) = 'Y' THEN
  52.        GENERATECOORDINATES
  53.      ELSE
  54.      BEGIN
  55.        WRITELN ('On each line give a pair of coordinates for a living cell.');
  56.        WRITELN ('Terminate the list by entering a 0 for X and Y');
  57.        READLN (X,Y);
  58.  
  59.        WHILE X <> 0 DO
  60.        BEGIN
  61.          IF (X>=1) AND (X<=MAXROW) AND (Y>=1) AND (Y<=MAXCOL)
  62.              THEN MAP[X,Y] := ALIVE
  63.              ELSE WRITELN ('Values out of range.');
  64.          READLN (X,Y);
  65.        END;  { WHILE }
  66.      END; { ELSE }
  67. END;
  68.  
  69. {--------------------------------------------}
  70.  
  71. PROCEDURE WRITEMAP;
  72. VAR
  73.      X : ROW;
  74.      Y : COL;
  75.      FULL : CHAR;
  76. BEGIN
  77.      FULL:= CHR(2);
  78.      CLRSCR;
  79.      WRITELN ('The map at generation',generation:5,' is  below');
  80.      FOR X := 1 TO MAXROW DO
  81.      BEGIN
  82.         FOR Y := 1 TO MAXCOL DO
  83.            IF MAP[X,Y] = ALIVE THEN BEGIN
  84.                                       GOTOXY(Y,X+2);
  85.                                       WRITE (FULL);
  86.                                     END;
  87.      END;      { Processing row X }
  88.      GOTOXY(1,1);
  89. END;
  90.  
  91. {--------------------------------------------}
  92.  
  93. FUNCTION NEIGHBORCOUNT (I:ROW;J:COL):INTEGER;
  94. VAR
  95.      X, XLOW, XHIGH : ROW;
  96.      Y, YLOW, YHIGH : COL;
  97.      COUNT : INTEGER;
  98. BEGIN
  99.      IF I = 1 THEN XLOW := 1
  100.               ELSE XLOW := I - 1;
  101.      IF I = MAXROW THEN XHIGH := 1
  102.                    ELSE XHIGH := I + 1;
  103.      IF J = 1 THEN YLOW := 1
  104.               ELSE YLOW := J - 1;
  105.      IF J = MAXCOL THEN YHIGH := J
  106.                    ELSE YHIGH := J + 1;
  107.      COUNT := 0;
  108.      FOR X := XLOW TO XHIGH DO
  109.         FOR Y := YLOW TO YHIGH DO
  110.            IF MAP[X,Y] = ALIVE THEN COUNT := COUNT + 1;
  111.      IF MAP [I,J] = ALIVE THEN COUNT := COUNT - 1;
  112.      NEIGHBORCOUNT := COUNT;
  113. END;
  114.  
  115. {--------------------------------------------}
  116.  
  117. BEGIN
  118.      INITIALIZE;
  119.      GENERATION := 0;
  120.      WRITEMAP;
  121.      FOR GENERATION := 1 TO LASTGENERATION DO
  122.      BEGIN
  123.         FOR I := 1 TO MAXROW DO FOR J := 1 TO MAXCOL DO
  124.            CASE NEIGHBORCOUNT(I,J) OF
  125.               0,1   : NEWMAP[I,J] := DEAD;
  126.               2     : NEWMAP[I,J] := MAP[I,J];
  127.               3     : NEWMAP[I,J] := ALIVE;
  128.               4..8  : NEWMAP[I,J] := DEAD
  129.               END;
  130.         FOR I := 1 TO MAXROW DO FOR J := 1 TO MAXCOL DO
  131.            MAP[I,J] := NEWMAP[I,J];
  132.         WRITEMAP;
  133.      END      { Processing one generation }
  134. END.
  135.